Session Management হল একটি গুরুত্বপূর্ণ নিরাপত্তা বৈশিষ্ট্য যা স্প্রিং সিকিউরিটিতে ব্যবহারকারীর সেশন কন্ট্রোল এবং সুরক্ষা পরিচালনা করে। এটি সেশন টাইমআউট, সেশন ফিক্সেশন, একাধিক সেশন ব্যবস্থাপনা, এবং একাধিক লগইন কন্ট্রোল করার মতো গুরুত্বপূর্ণ কাজগুলির জন্য ব্যবহৃত হয়।
স্প্রিং সিকিউরিটি দিয়ে Session Management পরিচালনা করার মাধ্যমে আপনি নিরাপত্তা নীতি প্রয়োগ করতে পারেন, যেমন:
- সেশনের জীবনকাল নিয়ন্ত্রণ করা
- একাধিক সেশন সীমিত করা
- সেশন ফিক্সেশন আক্রমণ প্রতিরোধ করা
Session Management কনফিগারেশন উদাহরণ
স্প্রিং সিকিউরিটির মাধ্যমে সেশন ম্যানেজমেন্ট কনফিগার করতে হলে HttpSecurity এর sessionManagement() মেথড ব্যবহার করতে হবে। এর মাধ্যমে আপনি বিভিন্ন সেশন পলিসি কাস্টমাইজ করতে পারেন।
1. Session Timeout কনফিগারেশন
স্প্রিং সিকিউরিটি দিয়ে সেশন টাইমআউট সেট করা যেতে পারে, যাতে নির্দিষ্ট সময় পর সেশন এক্সপায়ার হয়ে যায়।
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
.and()
.sessionManagement()
.invalidSessionUrl("/session-invalid") // If session expires, redirect to this URL
.maximumSessions(1) // Maximum one session per user
.expiredUrl("/session-expired") // If session expires, redirect to this URL
.and()
.and()
.formLogin()
.and()
.logout()
.permitAll();
}
}
এখানে:
invalidSessionUrl("/session-invalid"): যদি সেশন এক্সপায়ার হয়, ব্যবহারকারীকে একটি নির্দিষ্ট URL-এ রিডাইরেক্ট করা হবে।maximumSessions(1): প্রতিটি ব্যবহারকারীর জন্য সর্বোচ্চ একটি সেশন অনুমোদিত। এটি ব্যবহারকারীর একাধিক লগইন প্রতিরোধ করবে।expiredUrl("/session-expired"): সেশন এক্সপায়ার হলে, ব্যবহারকারীকে এই URL-এ রিডাইরেক্ট করা হবে।
2. Session Fixation Protection
স্প্রিং সিকিউরিটি Session Fixation আক্রমণ প্রতিরোধ করতে sessionFixation() পদ্ধতি ব্যবহার করে। এই পদ্ধতির মাধ্যমে সেশন আইডি ফিক্সড থাকা থেকে রক্ষা করা হয়।
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
.and()
.sessionManagement()
.sessionFixation().migrateSession() // Migrate to a new session ID after login
.and()
.formLogin()
.and()
.logout()
.permitAll();
}
এখানে migrateSession() ব্যবহার করা হয়েছে, যার মাধ্যমে ব্যবহারকারী লগইন করার পরে নতুন সেশন আইডি জেনারেট করা হয় এবং পুরনো সেশন আইডি বাতিল করা হয়। এতে সেশন ফিক্সেশন আক্রমণ থেকে রক্ষা পাওয়া যায়।
3. Multiple Sessions Per User
স্প্রিং সিকিউরিটি দিয়ে আপনি একটি ব্যবহারকারীর একাধিক সেশন সীমিত করতে পারেন। যদি আপনি চান যে একটি ব্যবহারকারী একাধিক ডিভাইসে বা ব্রাউজারে লগইন করতে না পারে, তাহলে আপনি maximumSessions() পদ্ধতি ব্যবহার করতে পারেন।
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
.and()
.sessionManagement()
.maximumSessions(1) // Allow only one session per user
.expiredUrl("/session-expired") // Redirect when session expires
.and()
.and()
.formLogin()
.and()
.logout()
.permitAll();
}
এখানে maximumSessions(1) ব্যবহারকারীকে সর্বোচ্চ একটি সেশন আইডি অনুমোদিত করে।
4. Custom Session Management Handler
স্প্রিং সিকিউরিটির মাধ্যমে আপনি কাস্টম সেশন হ্যান্ডলিংও করতে পারেন, যেমন সেশন পরিবর্তন বা সেশন এক্সপায়ার হওয়ার পর কাস্টম রিডাইরেক্ট।
Custom Session Expired Handler:
@Component
public class CustomSessionExpiredStrategy extends SimpleRedirectInvalidSessionStrategy {
public CustomSessionExpiredStrategy() {
super("/session-expired"); // Redirect to this page when session expires
}
@Override
protected String getTargetUrl(HttpServletRequest request) {
return "/session-expired";
}
}
কনফিগারেশন:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/session-expired").permitAll()
.anyRequest().authenticated()
.and()
.sessionManagement()
.invalidSessionStrategy(customSessionExpiredStrategy) // Use custom session expired handler
.and()
.formLogin()
.and()
.logout()
.permitAll();
}
5. Single Session Per User
যদি আপনি চান যে একটি ব্যবহারকারী একই সময়ে একাধিক ডিভাইসে লগইন করতে না পারে, তাহলে এই পদ্ধতি ব্যবহার করতে পারেন:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
.and()
.sessionManagement()
.maximumSessions(1) // Allow only one session per user
.expiredUrl("/session-expired") // Redirect if session expires
.and()
.and()
.formLogin()
.and()
.logout()
.permitAll();
}
6. Session Creation Policy
স্প্রিং সিকিউরিটিতে সেশন কিভাবে তৈরি হবে তা নিয়ন্ত্রণ করা যায় sessionCreationPolicy() এর মাধ্যমে। এটি বিশেষত RESTful APIs-এর জন্য উপকারী।
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS) // No session is created for stateless applications
.and()
.formLogin()
.and()
.logout()
.permitAll();
}
এখানে SessionCreationPolicy.STATELESS ব্যবহার করে সেশন ক্রিয়েশন নিষ্ক্রিয় করা হয়েছে।
উপসংহার
স্প্রিং সিকিউরিটিতে সেশন ম্যানেজমেন্ট ব্যবহারকারীর সেশন কন্ট্রোল ও নিরাপত্তা নিশ্চিত করতে সাহায্য করে। সেশন টাইমআউট, সেশন ফিক্সেশন প্রটেকশন, একাধিক সেশন সীমাবদ্ধকরণ এবং কাস্টম সেশন ম্যানেজমেন্ট হ্যান্ডলার ব্যবহার করে আপনার অ্যাপ্লিকেশনটির নিরাপত্তা আরও শক্তিশালী করা সম্ভব।
Read more